package org.example.work;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.stream.Collectors;

public class 排序 {
    public static void main1(String[] args) {
// 假设 set 是一个 Set<JSONObject> 集合
        Set<JSONObject> set = new HashSet<>();
// 初始化 set...
        JSONObject obj1 = new JSONObject();
        obj1.put("sortCode", 1);
        set.add(obj1);
        JSONObject obj2 = new JSONObject();
        obj2.put("sortCode", 3);
        set.add(obj2);
        JSONObject obj3 = new JSONObject();
        obj3.put("sortCode", 2);
        set.add(obj3);
        JSONObject obj4 = new JSONObject();
        obj4.put("sortCode", null);
        set.add(obj4);   // 无效对象
        List<JSONObject> list = new ArrayList<>(set);

// 排序前过滤掉没有 sortCode 或 sortCode 无效的对象
        list = list.stream()
                .filter(o -> o.containsKey("sortCode") && o.getInteger("sortCode") != null)
                .collect(Collectors.toList());

        // 对列表进行排序
        list.sort(Comparator.comparingInt(o -> o.getInteger("sortCode")));

        // 打印排序后的列表
        for (JSONObject obj : list) {
            System.out.println(obj.toJSONString());
        }
    }

    public static void main(String[] args) {
        Set<JSONObject> set = new HashSet<>();
// 初始化 set...
        JSONObject obj1 = new JSONObject();
        obj1.put("sortCode", 1);
        obj1.put("subItemId", 11);
        set.add(obj1);
        JSONObject obj2 = new JSONObject();
        obj2.put("sortCode", 3);
        obj2.put("subItemId", 13);
        set.add(obj2);
        JSONObject obj3 = new JSONObject();
        obj3.put("sortCode", 2);
        obj3.put("subItemId", 12);
        set.add(obj3);
        JSONObject obj4 = new JSONObject();

        obj4.put("subItemId", 14);
        JSONObject obj5 = new JSONObject();
        obj5.put("sortCode", 5);
        obj5.put("subItemId", null);
        set.add(obj5);
        JSONObject obj6 = new JSONObject();
        obj6.put("sortCode", 6);
        obj6.put("subItemId", "     ");
        set.add(obj6);
        List<JSONObject> list = new ArrayList<>(set);
        boolean containsSortCode = false;
        for (JSONObject obj : set) {
            if (obj.containsKey("sortCode")) {
                containsSortCode = true;
                break;
            }
        }
        list.forEach(o -> System.out.println(o.toJSONString()));
//        System.out.println("-------------排序-方法一:用stream流 在排序前 过滤掉没有 sortCode 或 sortCode 无效的对象--然后再用list.sort()排序-----------------------------------------");
//        if (containsSortCode) {
//            list = list.stream()
//                    .filter(o -> o.containsKey("sortCode") && o.getInteger("sortCode") != null) // 过滤掉没有 sortCode 或 sortCode 无效的对象
//                    .filter(o -> o.getString("subItemId") != null && !StringUtils.isBlank(o.getString("subItemId")))// 过滤掉没有 sortCode 或 sortCode 无效的对象
//                    .collect(Collectors.toList());//将通过流式操作过滤后的 JSONObject 对象收集到一个新的列表中
//            list.sort(Comparator.comparingInt(o -> o.getInteger("sortCode")));
//            for (JSONObject obj : list) {
//                System.out.println(obj.toJSONString());
//            }
//        } else {
//            list = list.stream()
//                    .filter(o -> o.getString("subItemId") != null && !StringUtils.isBlank(o.getString("subItemId")))// 过滤掉没有 sortCode 或 sortCode 无效的对象
//                    //sortCode是"" o.getInteger("sortCode") 将会返回 null，是因为 getInteger 方法通常会尝试将字符串转换为整数，但如果字符串是一个非数字的字符串（例如 " "），转换将失败，结果返回 null
//                    .collect(Collectors.toList());//将通过流式操作过滤后的 JSONObject 对象收集到一个新的列表中
//            list.forEach(System.out::println);
//        }
        System.out.println("---------方法二:用TreeSet 排序----------------------------------------");
        if (containsSortCode) {
            TreeSet<JSONObject> treeSet = new TreeSet<>(Comparator.comparingInt(o ->
                    o.containsKey("sortCode") ? o.getInteger("sortCode") : Integer.MAX_VALUE));
            treeSet.addAll(set);
            List<JSONObject> list2 = new ArrayList<>(treeSet);
            // 过滤掉没有 sortCode 或 sortCode 无效的对象，存在才排序
            list2 = list2.stream()
                    .filter(o -> o.containsKey("sortCode") && o.getInteger("sortCode") != null)
                    .filter(o -> o.getString("subItemId") != null && !StringUtils.isBlank(o.getString("subItemId")))// 过滤掉没有 sortCode 或 sortCode 无效的对象
                    .collect(Collectors.toList());
            list2.forEach(System.out::println);
        } else {
            list = list.stream().filter(o -> !StringUtils.isBlank(o.getString("subItemId")))//这里过滤掉了 subItemId 为 null、空字符串，或者只包含空格的对象
                    //如果 subItemId 为 null、空字符串，或者只包含空格，则 StringUtils.isBlank(...) 将返回 true
                    //当 subItemId 有值时，StringUtils.isBlank(...) 将返回 false，！StringUtils.isBlank(...) 将返回 true，所以这里过滤掉了 subItemId 为 null、空字符串，或者只包含空格的对象
                    .collect(Collectors.toList());//将通过流式操作过滤后的 JSONObject 对象收集到一个新的列表中
            for (JSONObject obj : list) {
                System.out.println(obj.toJSONString());
            }
        }
    }
}

/**
 * HashSet是无序的，所以排序后结果可能与原始顺序不一致。
 * 为了保证排序的正确性，需要过滤掉无效对象，或者使用有序的集合如TreeSet。
 */
//预览排序另一个写法
//boolean containsSortCode=false;
//Set<JSONObject> set=new HashSet<>();
//        for (int i = 0; i < jsonArray.size(); i++) {
//        set.add(jsonArray.getJSONObject(i));
////            if (jsonArray.getJSONObject(0).getString("sortCode")!=null){
////                flag=true;
////            }
//        }
//        for (int i = 0; i < jsonArray1.size(); i++) {
//        set.add(jsonArray1.getJSONObject(i));
////            if (jsonArray1.getJSONObject(0).getString("sortCode")!=null){
////                flag=true;
////            }
//        }
//        for (JSONObject obj : set) {
//        if (obj.containsKey("sortCode")) {
//        containsSortCode = true;
//        break;
//        }
//        }
//        List<JSONObject> list = new ArrayList<>(set);
//        if (containsSortCode) {
//        list = list.stream()
//                    .filter(o -> o.containsKey("sortCode") && o.getInteger("sortCode") != null)
//        .collect(Collectors.toList());// 过滤掉无效对象
//        list.sort(Comparator.comparingInt(o -> o.getInteger("sortCode")));
//        }
//        Object[] objects = list.toArray();
//        return JSON.parseArray(Arrays.toString(objects));